#include <dretve.h>
#include <ispis.h>
#include <vrijeme.h>

#define BRCITACA 3
#define BRPISACA 2

static int cp;

static void citaci(void *x)
{
	int i, id = id_dretve();
	vrijeme_t koliko;

	koliko.sekunde = id;
	koliko.nsekunde = 0;
	
	ispisi("Dretva %d pocetak\n", id);

#define NN 5
	for (i = 0; i < NN; i++) {
		ispisi("Dretva %d, oce citati = %d\n", id, i + 1);

		zakljucaj_na_citanje(cp);
		ispisi("Dretva %d, cita = %d\n", id, i + 1);
		spavaj(koliko);
		ispisi("Dretva %d, zavrsava citanje = %d\n", id, i + 1);
		otkljucaj_citanje_pisanje(cp);

		spavaj(koliko);
	}
#undef NN

	ispisi("Dretva %d zavrsava\n", id);
}

static void pisaci(void *x)
{
	int i, id = id_dretve();
	vrijeme_t koliko;

	koliko.nsekunde = 0;
	
	ispisi("Dretva %d pocetak\n", id);

#define NN 4
	for (i = 0; i < NN; i++) {
		ispisi("Dretva %d, oce pisati = %d\n", id, i + 1);

		zakljucaj_na_pisanje(cp);
		ispisi("Dretva %d, pise = %d\n", id, i + 1);

		koliko.sekunde = id;
		spavaj(koliko);
		ispisi("Dretva %d, zavrsava pisanje = %d\n", id, i + 1);
		otkljucaj_citanje_pisanje(cp);

		koliko.sekunde = id * 2;
		spavaj(koliko);
	}
#undef NN

	ispisi("Dretva %d zavrsava\n", id);
}

void test_pisaci_citaci()
{
	ispisi("\n[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);

	int dr[BRCITACA + BRPISACA], i;
	
	cp = dohvati_pisi_citaj();
	if (cp == -1) {
		ispisi("nema barijere!\n");
		return;
	}

	for (i = 0; i < BRCITACA; i++) {
		dr[i] = stvori_dretvu(citaci, NULL);
		if (dr[i] == -1)
			break;
	}
	for (; i >= BRCITACA && i < BRCITACA + BRPISACA; i++) {
		dr[i] = stvori_dretvu(pisaci, NULL);
		if (dr[i] == -1)
			break;
	}

	for (i = i - 1; i >= 0; i--)
		cekaj_kraj_dretve(dr[i]);
	
	obrisi_sinkro(cp);
}
